#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>

//#define N 5
//void runchild()
//{
//    int cnt = 5;
//    while(cnt)
//    {
//        printf("child,pid:%d, ppid:%d, cnt:%d\n", getpid(), getppid(), cnt);
//        cnt--;
//        sleep(1);
//    }
//    exit(0);
//}
//

#define TASK_NUM 5
typedef void (*task_t)();
task_t tasks[TASK_NUM];
void Task1()
{
    printf("这是任务1\n");
}

void Task2()
{
    printf("这是任务2\n");
}

void Task3()
{
    printf("这是任务3\n");
}


int AddTask(task_t t)
{
    int i = 0;
    for(; i < TASK_NUM; i++)
    {
        if(!tasks[i])  break;
    }

    if(i == TASK_NUM)  return -1;
    else  tasks[i] = t;

    return 0;

}
void InitTasks()
{
    for(int i = 0; i < TASK_NUM; i++)
    {
        tasks[i] = NULL;
    }
    AddTask(Task1);
    AddTask(Task2);
    AddTask(Task3);
}

void ExecuteTask()
{
    InitTasks();
    for(int i = 0; i < TASK_NUM; i++)
    {
        if(tasks[i])  tasks[i]();
    }
}
int main()
{
  // for(int i = 0; i < N; i++)
  // {
  //      pid_t id = fork();
  //      if(id == 0)
  //      {
  //          //child
  //          runchild();
  //      }
  // }

  // for(int i = 0; i < N; i++)
  // {
  //     pid_t ret = wait(NULL);
  //     if(ret > 0)
  //     {
  //         printf("wait success\n");
  //     }
  //     sleep(1);
  // }
   
    pid_t id = fork();
    if(id < 0)
    {
        perror("fork");
        return 1;
    }
    if(id == 0)
    {
        //child
        int cnt = 5;
        while(cnt)
        {
           // int* a = NULL;
           // *a = 100;
            printf("I am child, pid:%d, ppid:%d, cnt:%d\n", getpid(), getppid(), cnt);
            cnt--;
            sleep(1);
        }
        exit(11);
    }
    else if(id > 0)
    {
        //parent
      //  int cnt = 10;
      //  while(cnt)
      //  {
      //      printf("I am parent, pid:%d, ppid:%d, cnt:%d\n", getpid(), getppid(), cnt);
      //      cnt--;
      //      sleep(1);
      //  }
        
       // int status = 0;
       // pid_t ret = waitpid(-1, &status, 0);
       // if(ret == id)
       // {
       //     printf("等待进程成功, exit seg:%d, exit code:%d\n", status&0x7F, status>>8&0xFF);
       // }
       // sleep(5);
        
       int status = 0;
       while(1)
       {
            pid_t ret = waitpid(id, &status, WNOHANG); 
            if(ret > 0)
            {
               // printf("success wait\n");
                if(WIFEXITED(status))
                {
                   // printf("pid:%d, ppid:%d, exit code:%d\n", getpid(), getppid(), WEXITSTATUS(status));
                   printf("进程是正常跑完的，退出码:%d\n", WEXITSTATUS(status));
                }
                else 
                {
                    printf("进程出异常\n");
                }
                break;
            }
            else if(ret < 0)
            {
                printf("wait fail\n");
                break;
            }
            else if(ret == 0)
            {
                printf("快点我等不及了\n");
               ExecuteTask();
                sleep(1);
            }
       }
        
    }
    
    return 0;
}
